﻿using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
using GS1.Utilitario;
using System.Data;
using System.Configuration;
using System.Security.Cryptography;
using System.Xml.Linq;
using System.Text;
using System.Xml;


namespace GS1.DataAccess
{
    public static class DataBaseHelper
    {
            #region --- Enumeradores y Constantes ---
            public enum TipoProveedor
            {
                SQLSERVER = 0,
                ORACLE = 1
            }
 
            private const string PROVEEDOR_ORACLE = "ORACLE";
            private const string CODIGO_EMPRESA = "";
            private const string CODIGO_SISTEMA = "QS5";
            private const string CODIGO_MODULO = "QS51";
            private const string ESQUEMA = ""; //"QS5.";
            private const string FORMATO_ESQUEMA_PROCEDIMIENTO = "{0}{1}";

            #endregion

            #region --- Metodos Propios ---
            public static string obtenerDbProveedor(string nombreConexion)
            {
                return ConfigurationManager.ConnectionStrings[nombreConexion].ProviderName;
            }

            public static string obtenerDbCadenaConexion(string nombreConexion)
            {
               // nombreConexion = ConfigurationManager.ConnectionStrings[nombreConexion].ConnectionString.desEncriptarDES(ConstantesDAO.LLAVE_3DS).ToString();
                nombreConexion = desEncriptarDES( ConfigurationManager.ConnectionStrings[nombreConexion].ToString(), ConfigurationManager.AppSettings[ConstantesDAO.LLAVE_3DS]); 
                return nombreConexion;
                //ConfigurationManager.ConnectionStrings[nombreConexion].ConnectionString;
            }

            public static string obtenerCodigoEmpresa()
            {
                return CODIGO_EMPRESA;
            }

            public static string obtenerCodigoSistema()
            {
                return CODIGO_SISTEMA;
            }

            public static string obtenerCodigoModulo()
            {
                return CODIGO_MODULO;
            }

            public static TipoProveedor obtenerDbTipoProveedor(string nombreConexion)
            {
                TipoProveedor tipoProveedor = TipoProveedor.ORACLE;

                nombreConexion = desEncriptarDES(ConfigurationManager.ConnectionStrings[nombreConexion].ToString(), ConfigurationManager.AppSettings[ConstantesDAO.LLAVE_3DS]); 

                //TipoProveedor tipoProveedor = TipoProveedor.SQLSERVER;
                string proveedor = ConfigurationManager.ConnectionStrings[nombreConexion].ProviderName.ToUpper();
                //string proveedor = nombreConexion.ProviderName.ToUpper();

                if (proveedor.Equals(TipoProveedor.ORACLE))
                {
                    tipoProveedor = TipoProveedor.ORACLE;
                }

                return tipoProveedor;
            }

            public static string obtenerNombreProcedimiento(string nombreProcedimiento)
            {
                return string.Format(FORMATO_ESQUEMA_PROCEDIMIENTO, ESQUEMA,
                                                                    nombreProcedimiento);
            }

            public static string desEncriptarDES(string data, string llave)
            {
                TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();

                byte[] bytKey = UTF8Encoding.UTF8.GetBytes(llave);

                DES.Mode = System.Security.Cryptography.CipherMode.ECB;
                DES.Key = bytKey;
                DES.Padding = PaddingMode.PKCS7;

                ICryptoTransform DESDeEncrypt = DES.CreateDecryptor();

                Byte[] Buffer = Encoding.Default.GetBytes(data.desEncriptarBase64());

                return Encoding.Default.GetString(DESDeEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
            }
            #endregion

            #region --- Metodos de Encriptacion y Desencriptacion Base64 ---
            /// <summary>
            /// Funcion que permite encriptar una cadena en BASE 64
            /// </summary>
            /// <param name="data">Cadena a encriptar</param>
            /// <returns>Retorna Cadena encriptada</returns>
            public static string encriptarBase64(this string data)
            {
                byte[] bytes = Encoding.Default.GetBytes(data);
                return Convert.ToBase64String(bytes, 0, bytes.Length);
            }

            /// <summary>
            /// Funcion que permite de desencriptar una cadena en BASE 64
            /// </summary>
            /// <param name="data">Cadena a ser desencriptada</param>
            /// <returns>Retorna Cadena desencriptada</returns>
            public static string desEncriptarBase64(this string data)
            {
                byte[] bytes = Convert.FromBase64String(data);
                return Encoding.Default.GetString(bytes, 0, bytes.Length);
            }
            #endregion
        }

        /// <summary>
        /// <para>Clase       : ConstantesDAO</para>
        /// <para>Descripcion : Permite definir los nombres de las interfaces para DAO</para>
        /// <para>Autor       : Pedro Miguel Vera Rafael</para>
        /// <para>Fecha       : 15/06/2011</para>
        /// <para>Empresa     : GS1 Peru</para>
        /// </summary>
        public static class ConstantesDAO
        {
            /// <summary>
            /// Nombre de la interface para acceder a fuentes de datos 
            /// </summary>
            public enum NombreInterface
            {
                ConexHermes = 0,
            }

            public const string LLAVE_3DS = "LLAVE";

        }
    }
